# 面向对象和面向过程：
# 面向过程就是先分析出解决问题的步骤，再把步骤拆成一个个方法，是没有对象去调用的，通过一个个方法的执行解决问题。
# 面向对象就是将编程当成是一个事物（对象），对外界来说，事物是直接使用的，不用去管内部的情况，而编程就是设置事物能做什么事情。

# 类和对象
# 类：对一系列具有相同属性和行为的事物的统称，是一个抽象的概念，不是真实存在的事物。

# 基本格式：
# class 类名：
#     代码块

# 注意：类名要符合标识符规定，同时遵循大驼峰命名法，见名知意。

# 对象：类的具体表现，是面向对象编程的核心
# 实例化（创建）对象的格式：
# 对象名=类名()

# 注意：
# 1.先有类，再有对象
# 2类只有一个，对象可以有很多个

# 类的三要素
# 1.类名
# 2.属性：对象的特征描述，用来说明是什么样子的
# 3.方法：对象具有的功能（行为），用来说明能够做什么

# 类
class Washer:
    height = 800  # 类的属性：属性名 = 属性值


# 查看类属性：类名.属性名
print(Washer.height)

# 新增类属性:类名.属性名 = 值
Washer.width = 450
print(Washer.width)

# 创建对象
# 创建对象的过程也叫实例化对象
# 基本格式：对象名 = 类名()
# 实例化一个洗衣机对象
wa = Washer()
print(wa)  # 显示对象在内存的地址<__main__.Washer object at 0x000001F64C5D6A90>
wa2 = Washer()
print(wa2)
print("---------------")


# 实例方法和实例属性
# 实例方法
# 由对象调用，至少有一个self参数，执行实例方法的时候，自动将调用该方法的对象 属性赋值给self

class Washer:
    height = 800  # 类的属性：属性名 = 属性值

    def wash(self):
        print("我会洗衣服做饭")
        print("方法中的self：", self)  # self表示当前调用该方法的对象，out：方法中的self： <__main__.Washer object at 0x0000018DE08D6310>


# 实例化对象
wa = Washer()
print(wa)
# 对象调用方法
wa.wash()


# self代表对象本身，当对象调用实例方法时，
# puthon会自动将对象本身的用作为参数传递到实侧友法的第一个参数self果面

# 实例属性
# 格式：self.属性名
class Person:
    name = "bingbing"  # 类属性

    def introduce(self):  # 实例方法
        print("我是实例方法")
        print(f"{Person.name}的年龄是:{self.age}")  # self.age是实例属性


pe = Person()
pe.age = 18
pe.sex = '女'  # 新增实例属性
print(pe.sex)  # 根据对象名访问实例属性
# print(Person.sex) 这里会报错，因为实例属性只能由对对象名访问，不能由类名访问
print("Person.name:", Person.name)  # 访问类属性，类可以访问到，对象也可以访问到
print("pe.name:", pe.name)
pe.introduce()

# 1.2实例属性和类属性的区别
# 共类属性属于类，是公共的，大家都能访问到
# 实例属性属于对象的，是私有的共只能由对像名访间不能由类名访间

pe2 = Person()
# print(pe2.sex) #报错，sex = '女' 是给pe对象新增的实例属性，对其它对象依然没有这个属性
# 要让其他对象也有，就得给其它对象赋值
pe2.sex = '男'
print("pe2.sex:", pe2.sex)


# 构造函数
# __init__()
# 通常用来做属性初始化或者赋值操作
# 注意：在类实例化对象的时候，会被自动调用

class Test:
    def __init__(self):  # self 表示实例方法
        print("这是__init__()函数")


te = Test()


class Person:
    def __init__(self):
        self.name = 'bingbing'  # self或者对象名是实例属性
        self.age = 18
        self.height = 183

    def play(self):
        print(f'{self.name}在学习')

    def introduce(self):
        print(f'{self.name}的年龄是{self.age},身高是{self.height}cm')


# 实例化对象
pe = Person()
pe.play()
pe.introduce()
# 实例化第二个对象
pe2 = Person()
pe2.play()
pe2.introduce()


class Person2:
    def __init__(self, name, age, height):
        self.name = name  # self或者对象名是实例属性
        self.age = age
        self.height = height

    def play(self):
        print(f'{self.name}在学习')

    def introduce(self):
        print(f'{self.name}的年龄是{self.age},身高是{self.height}cm')

pe = Person2("zhangsan",15,182)
pe.play()
pe.introduce()

# 析构函数 __del__()
# del方法：
# 析构方法de1是对象在被垃圾回收的时候起作用的一个方法，它的执行一般地就意味着对象不能够继续引用，回收内存。
# 删除对象的时候，解释器会默认调用__del__()方法

class Person:
    def __init__(self):
        print("我是__init__()")
    def __del__(self):
        print("被销毁了")

p = Person()
print("这是第一行")
# 正常运行时不会调用__del__()方法，对象执行结束后，系统会自动调用__del__()方法
del p
print("这是第二行")
# del p语句执行的时候，内存会立即呗回收，会调用对象本身的__del__()方法
# __del__()主要是表示程序块或者函数已经全部执行结束。




